package com.example.javasystem.controller;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.javasystem.entity.ITable;
import com.example.javasystem.result.ApiResult;
import com.example.javasystem.result.ResultCode;
import com.example.javasystem.service.ResourceService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.Date;
import java.util.List;


@RestController
@RequestMapping("/dealResource")
@Slf4j
public class ITableController {

    @Autowired
    protected ResourceService resourceService;

    @ApiOperation("获取所有醋酸发酵信息")
    @GetMapping("/resource/select_all")
    @DS(value = "internal_table-ds")
    public ApiResult getAllResource() {
        log.info("================开始获取所有醋酸发酵信息=================");
        try {
            List<ITable> itableList = resourceService.getAllData();
            // 区分空数据和正常数据场景
            if (itableList == null || itableList.isEmpty()) {
                log.info("================未查询到醋酸发酵信息=================");
                return ApiResult.success("未查询到数据", Collections.emptyList());
            }
            log.info("================获取所有醋酸发酵信息成功，共{}条数据=================", itableList.size());
            JSONObject rtnObj = new JSONObject();
            rtnObj.put("allRes", itableList);
            return ApiResult.success(rtnObj);
        } catch (Exception e) {
            log.error("获取所有醋酸发酵信息失败", e);
            return ApiResult.error(ResultCode.FAILED.getCode(), "获取数据失败：" + e.getMessage());
        }
    }

    @ApiOperation("获取指定罐体醋酸发酵信息")
    @GetMapping("/resource/select_one/{tank_num}")
    @DS(value = "internal_table-ds")
    public ApiResult getOneResource(@PathVariable Integer tank_num) {
        log.info("================开始获取指定罐体[{}]的醋酸发酵信息=================", tank_num);
        try {
            // 参数校验：罐体编号不能为null或负数
            if (tank_num == null || tank_num <= 0) {
                log.warn("获取指定罐体信息失败：罐体编号[{}]不合法", tank_num);
                return ApiResult.error(ResultCode.VALIDATE_FAILED.getCode(), "罐体编号必须为正整数");
            }

            List<ITable> itableList = resourceService.getOneData(tank_num);
            // 区分空数据和正常数据场景
            if (itableList == null || itableList.isEmpty()) {
                log.info("================未查询到罐体[{}]的醋酸发酵信息=================", tank_num);
                return ApiResult.success("该罐体未查询到数据", Collections.emptyList());
            }

            log.info("================获取罐体[{}]的醋酸发酵信息成功，共{}条数据=================", tank_num, itableList.size());
            JSONObject rtnObj = new JSONObject();
            rtnObj.put("oneRes", itableList);
            return ApiResult.success(rtnObj);
        } catch (Exception e) {
            log.error("获取罐体[{}]的醋酸发酵信息失败", tank_num, e);
            return ApiResult.error(ResultCode.FAILED.getCode(), "获取数据失败：" + e.getMessage());
        }
    }

//    @ApiOperation("依据id对对应的醋酸数据进行删除")
//    @DeleteMapping("/resource/delete/{id}")
//    @DS(value = "internal_table-ds")
//    public ApiResult<?> deleteResource(@PathVariable Integer id) {
//        log.info("================依据id对对应的醋酸数据进行删除, 请求成功！=================");
//        // 参数校验
//        if (id == null || id <= 0) {
//            return ApiResult.error(ResultCode.VALIDATE_FAILED);
//        }
//        try {
//            int ret = resourceService.deleteById(id);
//            if (ret > 0) {
//                return ApiResult.success();
//            } else {
//                return ApiResult.error(ResultCode.DATA_NOT_FOUND);
//            }
//        } catch (Exception e) {
//            return ApiResult.error(ResultCode.FAILED);
//        }
//    }


    @ApiOperation("处理不合格数据")
    @GetMapping("/dealUnOkData")
    public ApiResult dealData() {
        log.info("================开始处理不合格数据=================");
        try {
            // 1. 调用服务层处理数据
            boolean ret = resourceService.cleanData();

            // 2. 根据处理结果返回不同信息
            JSONObject rtnObj = new JSONObject();
            if (ret) {
                log.info("================不合格数据处理完成=================");
                rtnObj.put("message", "不合格数据处理成功");
                rtnObj.put("success", true);
            } else {
                log.info("================无待处理的不合格数据=================");
                rtnObj.put("message", "无待处理的不合格数据");
                rtnObj.put("success", false);
            }
            return ApiResult.success(rtnObj);

        } catch (Exception e) {
            // 3. 捕获异常并记录日志
            log.error("处理不合格数据时发生异常", e);
            // 返回错误信息（避免暴露敏感堆栈）
            return ApiResult.error(ResultCode.FAILED.getCode(), "处理数据失败：" + e.getMessage());
        }
    }

    @ApiOperation("获取指定时间范围内的醋酸发酵信息")
    @GetMapping("/resource/select_by_time")
    @DS(value = "internal_table-ds")
    public ApiResult getByTimeRange(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {

        log.info("================开始获取[{}]至[{}]的醋酸发酵信息=================", startTime, endTime);
        try {
            // 参数校验
            if (startTime == null || endTime == null) {
                return ApiResult.error(ResultCode.VALIDATE_FAILED.getCode(), "开始时间和结束时间不能为空");
            }
            if (startTime.after(endTime)) {
                return ApiResult.error(ResultCode.VALIDATE_FAILED.getCode(), "开始时间不能晚于结束时间");
            }

            List<ITable> itableList = resourceService.getByTimeRange(startTime, endTime);
            if (itableList == null || itableList.isEmpty()) {
                log.info("================未查询到指定时间范围内的醋酸发酵信息=================");
                return ApiResult.success("未查询到数据", Collections.emptyList());
            }

            log.info("================获取指定时间范围数据成功，共{}条=================", itableList.size());
            JSONObject rtnObj = new JSONObject();
            rtnObj.put("timeRangeRes", itableList);
            return ApiResult.success(rtnObj);
        } catch (Exception e) {
            log.error("获取指定时间范围数据失败", e);
            return ApiResult.error(ResultCode.FAILED.getCode(), "获取数据失败：" + e.getMessage());
        }
    }

}


